

export default class BufferTool {


  /**
   * string,数字转换为buffer  小端字节序
   * @param {number} num
   * @return {Buffer} result
   */
  static dataToBuffer(data, length, connectObj) {
    // buffers will be buffers
    if (Buffer.isBuffer(data)) {
      return data;
    }
  
    // string to buffer
    if (typeof data === 'string') {
      return Buffer.from(data);
    }

    // string to buffer
    if (typeof data === 'function') {
      return data(connectObj);
    }
  
    /**
      0x3040转换结果  <Buffer 40 30 >
      低位字节在前，小端字节序。

      0x40 转换结果  <Buffer 40 00 >
     */ 
    var result = Buffer.allocUnsafe(length);
    for (var i = 0; i < length; i++) {
      // 先写入低位字节，然后右移，写入高位字节
      let movedNum = data >> (i * 8)
      if (i >= 4) { // 移动32位相当于没移动。比如 1 >> 32，还是1。 1 >> 33,相当于右移1位，就是到了32位之后，实际移动的位数为 n % 32 。因此这里>=32位的时候都直接赋值为0。
        movedNum = 0
      }
      result.writeUInt8(0xff & movedNum, i);
    }
    return result;
  }
  
  
  static dataListToBuffer(dataList) {
    let buff = new Buffer.alloc(0)

    dataList.map(i=>{
      let nbuf = this.dataToBuffer(i[0], i[1])
      console.log(nbuf)
      buff = Buffer.concat([buff,  nbuf])
    })

    return buff;
  }



  /**
   * 小端字节序buffer 转换为10进制数
   * @param {Buffer} buffer
   * @return {int}
  */
  static bufferToNumber(buffer) {
    // not a buffer go away
    if (!Buffer.isBuffer(buffer)) {
      return buffer;
    }
     /**
        0x3040存储为结果  <Buffer 40 30 >
     */ 
    var result = 0;
    for (var i = 0; i < buffer.length; i++) {
      // 先读取到低位字节，不左移，后续读到高位字节依次左移
      result += buffer.readUInt8(i) << (i * 8);
    }
    return result;
  }

   /**
   * 小端字节序转大端字节序
   * @param {Buffer} buff
   * @return {int}
  */
  static littleToBigEndian(buff){
    var nBuff = Buffer.allocUnsafe(buff.length)
    // 旧数组的第一位写入新数组的最后一位。
    for(var i =0; i<buff.length; i++){
     // targetBuffer: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number
      buff.copy(nBuff, buff.length-i-1, i, i+1)
    }
    return nBuff
  }

}